perm filename SYMBOL.MF[TEX,DEK] blob sn#726181 filedate 1983-07-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00074 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00006 00002	% The Computer Modern Symbols family of fonts (by D. E. Knuth, 1979).
C00010 00003	"Times operator"
C00011 00004	"Asterisk at the axis"
C00013 00005	"Elementary division operator"
C00016 00006	"Minus or plus sign"
C00018 00007	"Circle-minus operator"
C00019 00008	"Circle-divide operator"
C00020 00009	"Circle-dot operator"
C00025 00010	"Circle for copyright, etc."
C00026 00011	"Circle operator"
C00027 00012	"Bullet"
C00028 00013	"Hardy's asymptotic equivalence sign"
C00029 00014	"Reflexive subset sign"
C00031 00015	"Reflexive superset sign"
C00032 00016	"Precedes or equals sign"
C00035 00017	"Follows or equals sign"
C00036 00018	"Similarity sign"
C00037 00019	"Approximate equality sign"
C00039 00020	"Much less sign"
C00040 00021	"Much greater sign"
C00043 00022	"Precedes sign"
C00044 00023	"Follows sign"
C00045 00024	"Northeast arrow"
C00052 00025	"Southeast arrow"
C00054 00026	"Similar or equal sign"
C00055 00027	"Double leftward arrow"
C00057 00028	"Double rightward arrow"
C00058 00029	"Double upward arrow"
C00060 00030	"Double downward arrow"
C00062 00031	"Double left-and-right arrow"
C00064 00032	"Northwest arrow"
C00066 00033	"Southwest arrow"
C00068 00034	"Proportionality sign"
C00070 00035	"Prime symbol (intended as superscript only)"
C00071 00036	"Ownership sign"
C00072 00037	"Large triangle"
C00073 00038	"Large inverted triangle"
C00074 00039	"Zero-width slash to negate a relation"
C00078 00040	"Maps-to relation"
C00079 00041	"Empty set symbol"
C00084 00042	"Upper case Fraktur R"
C00087 00043	"Upper case Fraktur I"
C00089 00044	"Lattice top"
C00090 00045	"Perpendicular sign or lattice bottom"
C00092 00046	"Hebrew letter aleph"
C00095 00047	"Multiset union sign"
C00098 00048	"Left turnstile"
C00101 00049	"Right turnstile"
C00102 00050	"Left floor bracket"
C00103 00051	"Right floor bracket"
C00104 00052	"Left ceiling bracket"
C00105 00053	"Right ceiling bracket"
C00106 00054	"Left angle bracket"
C00109 00055	"Right angle bracket"
C00110 00056	"Double vertical line (norm or cardinality)"
C00112 00057	"Up and down arrow"
C00114 00058	"Double up-and-down arrow"
C00116 00059	"Wreath product"
C00120 00060	"Radical sign"
C00121 00061	"Amalgamation symbol or coproduct symbol"
C00123 00062	"Nabla or backwards-difference operator"
C00124 00063	"Square set union sign (Scott lub)"
C00127 00064	"Square set intersection sign (Scott glb)"
C00128 00065	"Square reflexive subset sign"
C00129 00066	"Square reflexive superset sign"
C00130 00067	"Section sign"
C00131 00068	"Dagger mark"
C00132 00069	"Double dagger mark"
C00133 00070	"Paragraph mark"
C00134 00071	"Club suit"
C00140 00072	"Diamond suit"
C00141 00073	"Heart suit"
C00142 00074	"Spade suit"
C00144 ENDMK
C⊗;
% The Computer Modern Symbols family of fonts (by D. E. Knuth, 1979).
danger=0;
codingscheme "TEX MATH SYMBOLS";
mi=1; input calu;	% upper case calligraphic alphabet

new refht,irrefht,eqht;
refht=mathspread[.85px,1.025px]+.5prt;
irrefht=mathspread[5/8px,3/4px]+.5prt;
eqht=mathspread[.225px,.275px]+.5prt;
% I should greatly reduce the number of uses of mathspread, by defining
% a few other useful abbreviations that account for its appearances!

if fixwidth=0:	texinfo slant, 0, 0, 0, px, (18+4ls)pu;
else: texinfo slant, 0, 0, 0, px, 9pu;
fi; % spacing is zero so that \TeX\ always adds italic corrections
% (The calling file should give the rest of the \&{texinfo}.)
new slant; slant=0; trxy 0;	% the non-script characters are unslanted

minus='000; cdot='001; diamond='005; pm='006; oplus='010; otimes='012;
eqv='021; leq='024; geq='025; subset='032; supset='033;
lftarrow='040; rtarrow='041; uparrow='042; dnarrow='043; dblarrow='044;
infinity='061; elt='062; forall='070; exists='071; not='072;
cup='133; cap='134; meet='136; join='137;
lbrace='146; rbrace='147; vert='152; rslash='156; int='163;
less=greater=under=neq=squotes=-1;
input sym;	% this covers the more common symbols
"Times operator";
call arithbegin('002);
cpen; x7=good10 1/sqrttwo[.5r,u]; y7=good10 1/sqrttwo[a,a+.5r-u];
x5=x7; x1=x3=r-x7; y1=y7; y3=y5; .5[y1,y3]=a;
w10 draw 7..3;	% upper left to lower right diagonal
draw 5..1.	% lower left to upper right diagonal
"Asterisk at the axis";
call charbegin('003,9,0,0,.5px+pa,.5px-pa,0);
new w99; w99=round(.6pixels.pw+blacker);	% thinner than hairline
new w98; w98=round .7[w99,w1];
cpen; top1y1=round(a+.5m); top1y1-bot1y2=m;
y0=.5[y1,y2]; x0=r-x0; x1=x2=x0;
x3=r-x4; x5=r-x6; x3=x5;	% left-right symmetry
y3=y4; y5=y6; y3-y5=y1-y0; .5[y3,y5]=y0;
x4-x0=(.5sqrt3)lft1 3.75u;	% asterisk will have 60-degree angles if $m=7.5u$
call `a cdraw(1,0,98,99);	% upper arm
call `b cdraw(2,0,98,99);	% lower arm
call `c cdraw(3,0,98,99);	% upper left arm
call `d cdraw(4,0,98,99);	% upper right arm
call `e cdraw(5,0,98,99);	% lower left arm
call `f cdraw(6,0,98,99).	% lower right arm
"Elementary division operator";
call arithbegin('004);
cpen; lft10x1=round u; x2=r-x1; y1=y2=a;
w10 draw 1..2;	% bar
new w99; w99=1.2w30;
y3-y4=round(mathspread[m,1.2m]+.5); .5[y3,y4]=a;
x3=x4=.5r;
w99 draw 3; draw 4.	% dots
"Minus or plus sign";
call arithbegin('007);
incy -round.12h;
cpen; .5[y1,y2]=a; x1=x2=.5r;
lft10x3=round u; x4=r-x3; y3=y4=a; y1=good10(a+x1-x3);
w10 draw 1..2;	% stem
draw 3..4;	% plus bar
x5=x3; x6=x4; y5=y6=y1; draw 5..6;	% minus bar
incy 0.
"Circle-minus operator";
call arithbegin('011);
if fudge≠1: new w0;	% lines will be thinner in fudged styles
	w0=round(fudge.pixels.pw+blacker);
fi;
cpen; lft0x6=round u; y6=a; x8=r-x8; y8=good0(a+x8-x6);
call circle(1,2,3,4,5,6,7,8,w0);	% bowl
w0 draw 6..2;	% bar
if fudge≠1: new w0;	% restore normal sizes in fudged styles
	w0=round(pixels.pw+blacker);
fi.
"Circle-divide operator";
call arithbegin('013);
if fudge≠1: new w0;	% lines will be thinner in fudged styles
	w0=round(fudge.pixels.pw+blacker);
fi;
cpen; lft0x6=round u; y6=a; x8=r-x8; y8=good0(a+x8-x6);
call circle(1,2,3,4,5,6,7,8,w0);	% bowl
w0 draw 5..1;	% lower left to upper right diagonal
if fudge≠1: new w0;	% restore normal sizes in fudged styles
	w0=round(pixels.pw+blacker);
fi.
"Circle-dot operator";
call arithbegin('014);
if fudge≠1: new w0;	% lines will be thinner in fudged styles
	w0=round(fudge.pixels.pw+blacker);
fi;
cpen; lft0x6=round u; y6=a; x8=r-x8; y8=good0(a+x8-x6);
call circle(1,2,3,4,5,6,7,8,w0);	% bowl
x0=x8; y0=y2;
cpen; 1.3w30 draw 0;	% dot
if fudge≠1: new w0;	% restore normal sizes in fudged styles
	w0=round(pixels.pw+blacker);
fi.
"Circle for copyright, etc.";
call charbegin('015,18,0,0,ph,pd,0);
cpen; top10y18=h+oo; bot10y14=-d-oo;
lft10x16=round u; rt10x12=round(r-u);
call circle(11,12,13,14,15,16,17,18,w10).	% enclosing cirle
"Circle operator";
call charbegin('016,9,0,0,3.5pu+pa,3.5pu-pa,0);
cpen; x8=.5r; lft10x6=round u; top10y8=round(a+3.5u); y6=a;
call circle(1,2,3,4,5,6,7,8,w10).	% bowl
"Bullet";
call charbegin('017,9,0,0,3.5pu+pa,3.5pu-pa,0);
cpen; x8=.5r; lft10x6=round u; top10y8=round(a+3.5u); y6=a;
call circle(1,2,3,4,5,6,7,8,w10);	% outer boundary
x0=x8; y0=y2;
cpen; w10 ddraw 1{x2-x8,y2-y8}..2{0,-1}..3{x4-x2,y4-y2}..4{-1,0}..
	5{x6-x4,y6-y4}..6{0,1}..7{x8-x6,y8-y6}..8{1,0}..1{x2-x8,y2-y8},
	0..0..0..0..0..0..0..0..0.	% fill it in
"Hardy's asymptotic equivalence sign";
call charbegin('020,14,0,0,pa+mathspread[.45px,.55px]+prt/2,
	-pa+mathspread[.45px,.55px]+prt/2,0);
vpen; lft10x1=round u; x2=x3=r-x1; x4=x1;
y1=y2=good10(a+(mathspread[.45m,.55m]+.5)); y3=y4; y1-a=a-y3;
x5=x6=.5[x1,x2]; y5=good10 .3[y1,y4]; y5-a=a-y6;
w10 draw 1{x5-x1,2(y5-y1)}..5{1,0}..2{x2-x5,2(y2-y5)};	% upper bar
draw 4{x6-x4,2(y6-y4)}..6{1,0}..3{x3-x6,2(y3-y6)}.	% lower bar
"Reflexive subset sign";
call charbegin('022,14,0,0,refht+pa,refht-pa,0);
cpen; lft10x1=round 1.5u; x2=x3=r-x1;
y2-y3=round(mathspread[5/4m,3/2m]+.5); y3-y7=round(mathspread[.45m,.55m]+.5);
y2=good10(a+.5(y2-y7));
.5[y2,y3]=y1; x4=x5=.5r; y4=y2; y5=y3;
w10 draw 2..4{-1,0}..1{0,-1}..5{1,0}..3;	% stroke
lft10x6=x1; x7=x2; y6=y7;
draw 6..7.	% bar
"Reflexive superset sign";
call charbegin('023,14,0,0,refht+pa,refht-pa,0);
cpen; lft10x2=round 1.5u; x2=x3=r-x1;
y2-y3=round(mathspread[5/4m,3/2m]+.5); y3-y7=round(mathspread[.45m,.55m]+.5);
y2=good10(a+.5(y2-y7));
.5[y2,y3]=y1; x4=x5=.5r; y4=y2; y5=y3;
w10 draw 2..4{1,0}..1{0,-1}..5{-1,0}..3;	% stroke
rt10x6=x1; x7=x2; y6=y7;
draw 6..7.	% bar
"Precedes or equals sign";
call charbegin('026,14,0,0,refht+pa,refht-pa,0);
vpen; lft10x1=round 1.5u; x2=x3=r-x1;
y2-y3=round(mathspread[5/4m,3/2m]+.5); y3-y7=round(mathspread[.45m,.55m]+.5);
y2=good10(a+.5(y2-y7));
.5[y2,y3]=y1; 
x4=x5=x2; y4=y2+.08h; y5=y3-.08h;
w10 draw (4..)2..1{-1,0}..1{1,0}..3(..5);	% diagonals
x6=x1; x7=x2; y6=y7;
draw 6..7.	% bar
"Follows or equals sign";
call charbegin('027,14,0,0,refht+pa,refht-pa,0);
vpen; lft10x2=round 1.5u; x2=x3=r-x1;
y2-y3=round(mathspread[5/4m,3/2m]+.5); y3-y7=round(mathspread[.45m,.55m]+.5);
y2=good10(a+.5(y2-y7));
.5[y2,y3]=y1; 
x4=x5=x2; y4=y2+.08h; y5=y3-.08h;
w10 draw (4..)2..1{1,0}..1{-1,0}..3(..5);	% diagonals
x6=x1; x7=x2; y6=y7;
draw 6..7.	% bar
"Similarity sign";
call charbegin('030,14,0,0,eqht+pa,eqht-pa,pa.slant-.5pu);
vpen; top10y1=round(a+mathspread[.225m,.275m]+eps);
top10y1-bot10y2=round mathspread[.45m,.55m];
lft10x3=round u; y5=.5[y1,y2]; y3=y2; y4=y1; x4=r-x3; x5=r-x5;
call `a zdraw(3,1,5,2,4,w10,w10+deltaw,5u/(e-m)).	% stroke
"Approximate equality sign";
call charbegin('031,14,0,0,refht+pa,refht-pa,0);
vpen; top10y1=round(a+mathspread[.495m,.605m]+eps);
top10y1-bot10y2=round mathspread[.45m,.55m];
lft10x3=round u; y5=.5[y1,y2]; y3=y2; y4=y1; x4=r-x3; x5=r-x5;
x8=x3; x9=x4; x10=x5;
y1-y6=y2-y7=y3-y8=y4-y9=y5-y10=round mathspread[.54m,.66m];
call `a zdraw(3,1,5,2,4,w10,w10+deltaw,5u/(e-m));	% upper stroke
call `b zdraw(8,6,10,7,9,w10,w10+deltaw,5u/(e-m)).	% lower stroke
"Much less sign";
call charbegin('034,18,0,0,irrefht+pa,irrefht-pa,0);
cpen; lft10x1=round u; rt10x2=round 11.5u; x3=x2;
y2=good10(a+1.1(mathspread[5/8m,3/4m])); .5[y2,y3]=y1=good10 a;
w10 draw 2..1..1..3;	% left diagonals
rt10x5=round(r-u); x6=x5; x4-x1=x5-x2; y4=y1; y5=y2; y6=y3;
draw 5..4..4..6.	% right diagonals
"Much greater sign";
call charbegin('035,18,0,0,irrefht+pa,irrefht-pa,0);
cpen; lft10x2=round u; rt10x1=round 11.5u; x3=x2;
y2=good10(a+1.1(mathspread[5/8m,3/4m])); .5[y2,y3]=y1=good10 a;
w10 draw 2..1..1..3;	% left diagonals
rt10x4=round(r-u); x6=x5; x4-x1=x5-x2; y4=y1; y5=y2; y6=y3;
draw 5..4..4..6.	% right diagonals
"Precedes sign";
call charbegin('036,14,0,0,irrefht+pa,irrefht-pa,0);
vpen; lft10x1=round 1.5u; x2=x3=r-x1;
y2=good10(a+mathspread[5/8m,3/4m]); .5[y2,y3]=y1=good10 a;
x4=x5=x2; y4=y2+.08h; y5=y3-.08h;
w10 draw (4..)2..1{-1,0}..1{1,0}..3(..5).	% diagonals
"Follows sign";
call charbegin('037,14,0,0,irrefht+pa,irrefht-pa,0);
vpen; lft10x2=round 1.5u; x2=x3=r-x1;
y2=good10(a+mathspread[5/8m,3/4m]); .5[y2,y3]=y1=good10 a;
x4=x5=x2; y4=y2+.08h; y5=y3-.08h;
w10 draw (4..)2..1{1,0}..1{-1,0}..3(..5).	% diagonals
"Northeast arrow";
call charbegin('045,18,0,0,ph,ph-2pa,0);
cpen; top10y1=h; .5[y1,y2]=a;
lft10x2=round u; rt10x1=round(r-u);
new aa; aa=(x1-x2)-(y1-y2);
if aa.aa≤1: new x2; x1-x2=y1-y2;	% correction if almost 45 degree angle
fi;
w10 draw 1..2;	% diagonal
new aa,bb,cc; aa=(x1-x2)/(3u+eps); bb=(y1-y2)/(.24h+eps); cc=1/sqrt(aa.aa+bb.bb);
x0=cc[x1,x2]; y0=cc[y1,y2]; x5=(-cc)[x1,x2]; y5=(-cc)[y1,y2];
x3=x0+cc(y2-y1); x6=x3+cc(y2-y1); x4=x0-cc(y2-y1); x7=x4-cc(y2-y1);
y3=y0+cc(x1-x2); y6=y3+cc(x1-x2); y4=y0-cc(x1-x2); y7=y4-cc(x1-x2);
rt6x8=rt10x1; new aa; x8=aa[x1,x2]; y8=aa[y1,y2];
epenyfactor w10; epenycorr -1; epen(0,0)(0,0)#;
w10 draw (5..)8..3(..6);	% erase excess at top
epenyfactor 1; epenycorr 0;
hpen; w0 draw (5..)8..3(..6);	% upper point
epenxfactor w10; epenxcorr -1; epen(0,1)#;
w10 draw (5..)8..4(..7);	% erase excess at right
epenxfactor 1; epenxcorr 0;
hpen; w0 draw (5..)8..4(..7).	% right point
"Southeast arrow";
call charbegin('046,18,0,0,ph,ph-2pa,0);
cpen; top10y2=h; .5[y1,y2]=a;
lft10x2=round u; rt10x1=round(r-u);
new aa; aa=(x1-x2)-(y2-y1);
if aa.aa≤1: new x2; x1-x2=y2-y1;	% correction if almost 45 degree angle
fi;
w10 draw 1..2;	% diagonal
new aa,bb,cc; aa=(x1-x2)/(3u+eps); bb=(y1-y2)/(.24h+eps); cc=1/sqrt(aa.aa+bb.bb);
x0=cc[x1,x2]; y0=cc[y1,y2]; x5=(-cc)[x1,x2]; y5=(-cc)[y1,y2];
x3=x0+cc(y2-y1); x6=x3+cc(y2-y1); x4=x0-cc(y2-y1); x7=x4-cc(y2-y1);
y3=y0+cc(x1-x2); y6=y3+cc(x1-x2); y4=y0-cc(x1-x2); y7=y4-cc(x1-x2);
rt6x8=rt10x1; new aa; x8=aa[x1,x2]; y8=aa[y1,y2];
epenxfactor w10; epenxcorr -1; epen(0,1)#;
w10 draw (5..)8..3(..6);	% erase excess at right
epenxfactor 1; epenxcorr 0;
hpen; w0 draw (5..)8..3(..6);	% upper point
epenyfactor w10; epenycorr +1; epen(0,0).(0,0)#;
w10 draw (5..)8..4(..7);	% erase excess at bottom
epenyfactor 1; epenycorr 0;
hpen; w0 draw (5..)8..4(..7).	% right point
"Similar or equal sign";
call charbegin('047,14,0,0,refht+pa,refht-pa,0);
vpen; top10y1=round(a+mathspread[.45m,.55m]+eps);
top10y1-bot10y2=a-y6=round mathspread[.45m,.55m];
lft10x3=round u; y5=.5[y1,y2]; y3=y2; y4=y1; x4=r-x3; x5=r-x5;
call `a zdraw(3,1,5,2,4,w10,w10+deltaw,5u/(e-m));	% stroke
cpen; y6=y7; lft10x6=round u; x7=r-x6;
w10 draw 6..7.	% bar
"Double leftward arrow";
call charbegin('050,18,0,0,eqht+pa,eqht-pa,0);
cpen; lft10x1=x0=round u; rt10x2=round(r-u); x11=x1; x12=x2;
y5=y8=good6 a; y1=y2; y11=y12; .5[y1,y11]=y5;
y1-y11=round(mathspread[.45m,.55m]+.5);
% these bars exactly match those on an equal sign, for extension purposes
w10 draw 1..2; draw 11..12;	% bars
hpen; lft1x8=x0;
x5-x8=x8-x3=-6u-eps; x3=x4=x6=x7;
y3-y6=y11-y3=y4-y1=y7-y4=.24h+eps;
lpen#; w10+w1 ddraw (5..)8..3(..6), 11..11;	% erase excess at lower left
hpen; draw (|w1|5..)8..|w0|3(..6);	% lower point
lpen#; w10+w1 ddraw (5..)8..4(..7), 1..1;	% erase excess at upper left
hpen; draw (|w1|5..)8..|w0|4(..7).	% upper point
"Double rightward arrow";
call charbegin('051,18,0,0,eqht+pa,eqht-pa,0);
cpen; lft10x2=round u; rt10x1=x0=round(r-u); x11=x1; x12=x2;
y5=y8=good6 a; y1=y2; y11=y12; .5[y1,y11]=y5;
y1-y11=round(mathspread[.45m,.55m]+.5);
w10 draw 1..2; draw 11..12;	% bars
hpen; rt1x8=x0;
x5-x8=x8-x3=6u+eps; x3=x4=x6=x7;
y3-y6=y11-y3=y4-y1=y7-y4=.24h+eps;
rpen#; w10+w1 ddraw (5..)8..3(..6), 11..11;	% erase excess at lower right
hpen; draw (|w1|5..)8..|w0|3(..6);	% lower point
rpen#; w10+w1 ddraw (5..)8..4(..7), 1..1;	% erase excess at upper right
hpen; draw (|w1|5..)8..|w0|4(..7).	% upper point
"Double upward arrow";
call charbegin('052,9,-1,-1,ph,ph-2pa,0);
cpen; top10y1=y0=h; .5[y1,y2]=a; y11=y1; y12=y2;
x0=x5=x8=good10 .5r; x1=x2; x11=x12;
.5[x1,x11]=x5; x1-x11=round(mathspread[.45m,.55m]+.5);
w10 draw 1..2; draw 11..12;	% stems
vpen; top1y8=y0;
lpen#; 2u+w10 draw 0..8; rpen#; 2u+w10 draw 0..8;	% clean the top
y5-y8=y8-y3=fixwidth[6u,3u]; y3=y4=y6=y7;
x3-x6=x12-x3=x4-x1=x7-x4=3u+eps;
lpen#; 2u+w10 draw (5..)8..3(..6);	% erase excess at left
vpen; draw (|w1|5..)8..|w6|3(..6);	% left point
rpen#; 2u+w10 draw (5..)8..4(..7);	% erase excess at right
vpen; draw (|w1|5..)8..|w6|4(..7).	% right point
"Double downward arrow";
call charbegin('053,9,-1,-1,ph,ph-2pa,0);
cpen; top10y2=h; .5[y1,y2]=a; y0=bot10y1; y11=y1; y12=y2;
x0=x5=x8=good10 .5r; x1=x2; x11=x12;
.5[x1,x11]=x5; x1-x11=round(mathspread[.45m,.55m]+.5);
w10 draw 1..2; draw 11..12;	% stems
vpen; bot1y8=y0;
lpen#; 2u+w10 draw 0..8; rpen#; 2u+w10 draw 0..8;	% clean the top
y5-y8=y8-y3=fixwidth[-6u,-3u]; y3=y4=y6=y7;
x3-x6=x12-x3=x4-x1=x7-x4=3u+eps;
lpen#; 2u+w10 draw (5..)8..3(..6);	% erase excess at left
vpen; draw (|w1|5..)8..|w6|3(..6);	% left point
rpen#; 2u+w10 draw (5..)8..4(..7);	% erase excess at right
vpen; draw (|w1|5..)8..|w6|4(..7).	% right point
"Double left-and-right arrow";
call charbegin('054,18,0,0,eqht+pa,eqht-pa,0);
cpen; lft10x2=x10=round u; rt10x1=x0=round(r-u); x11=x1; x12=x2;
y5=y8=good6 a; y1=y2; y11=y12; .5[y1,y11]=y5;
y1-y11=round(mathspread[.45m,.55m]+.5);
w10 draw 1..2; draw 11..12;	% bars
hpen; rt1x8=x0; lft1x18=x10;
x5-x8=x8-x3=x13-x18=x18-x15=4.5u+eps;
x3=x4=x6=x7; x13=x14=x16=x17;
y3-y6=y11-y3=y4-y1=y7-y4=.24h+eps;
y13=y3; y14=y4; y15=y5; y16=y6; y17=y7; y18=y8;
rpen#; w10+w1 ddraw (5..)8..3(..6), 11..11;	% erase excess at lower right
hpen; draw (|w1|5..)8..|w0|3(..6);	% lower right point
rpen#; w10+w1 ddraw (5..)8..4(..7), 1..1;	% erase excess at upper right
hpen; draw (|w1|5..)8..|w0|4(..7);	% upper right point
lpen#; w10+w1 ddraw (15..)18..13(..16), 12..12;	% erase excess at lower left
hpen; draw (|w1|15..)18..|w0|13(..16);	% lower left point
lpen#; w10+w1 ddraw (15..)18..14(..17), 2..2;	% erase excess at upper left
hpen; draw (|w1|15..)18..|w0|14(..17).	% upper left point
"Northwest arrow";
call charbegin('055,18,0,0,ph,ph-2pa,0);
cpen; top10y1=h; .5[y1,y2]=a;
lft10x1=round u; rt10x2=round(r-u);
new aa; aa=(x2-x1)-(y1-y2);
if aa.aa≤1: new x2; x2-x1=y1-y2;	% correction if almost 45 degree angle
fi;
w10 draw 1..2;	% diagonal
new aa,bb,cc; aa=(x1-x2)/(3u+eps); bb=(y1-y2)/(.24h+eps); cc=1/sqrt(aa.aa+bb.bb);
x0=cc[x1,x2]; y0=cc[y1,y2]; x5=(-cc)[x1,x2]; y5=(-cc)[y1,y2];
x3=x0+cc(y2-y1); x6=x3+cc(y2-y1); x4=x0-cc(y2-y1); x7=x4-cc(y2-y1);
y3=y0+cc(x1-x2); y6=y3+cc(x1-x2); y4=y0-cc(x1-x2); y7=y4-cc(x1-x2);
lft6x8=lft10x1; new aa; x8=aa[x1,x2]; y8=aa[y1,y2];
epenxfactor w10; epenxcorr +1; epen(-1,0)#;
w10 draw (5..)8..3(..6);	% erase excess at left
epenxfactor 1; epenxcorr 0;
hpen; w0 draw (5..)8..3(..6);	% upper point
epenyfactor w10; epenycorr -1; epen(0,0)(0,0)#;
w10 draw (5..)8..4(..7);	% erase excess at top
epenyfactor 1; epenycorr 0;
hpen; w0 draw (5..)8..4(..7).	% right point
"Southwest arrow";
call charbegin('056,18,0,0,ph,ph-2pa,0);
cpen; top10y2=h; .5[y1,y2]=a;
lft10x1=round u; rt10x2=round(r-u);
new aa; aa=(x2-x1)-(y2-y1);
if aa.aa≤1: new x2; x2-x1=y2-y1;	% correction if almost 45 degree angle
fi;
w10 draw 1..2;	% diagonal
new aa,bb,cc; aa=(x1-x2)/(3u+eps); bb=(y1-y2)/(.24h+eps); cc=1/sqrt(aa.aa+bb.bb);
x0=cc[x1,x2]; y0=cc[y1,y2]; x5=(-cc)[x1,x2]; y5=(-cc)[y1,y2];
x3=x0+cc(y2-y1); x6=x3+cc(y2-y1); x4=x0-cc(y2-y1); x7=x4-cc(y2-y1);
y3=y0+cc(x1-x2); y6=y3+cc(x1-x2); y4=y0-cc(x1-x2); y7=y4-cc(x1-x2);
lft6x8=lft10x1; new aa; x8=aa[x1,x2]; y8=aa[y1,y2];
epenyfactor w10; epenycorr +1; epen(0,0).(0,0)#;
w10 draw (5..)8..3(..6);	% erase excess at bottom
epenyfactor 1; epenycorr 0;
hpen; w0 draw (5..)8..3(..6);	% upper point
epenxfactor w10; epenxcorr +1; epen(-1,0)#;
w10 draw (5..)8..4(..7);	% erase excess at left
epenxfactor 1; epenxcorr 0;
hpen; w0 draw (5..)8..4(..7).	% right point
"Proportionality sign";
call charbegin('057,16.5,0,2.5,px,0,.5px.slant-.5pu);
if fudge≠1: new w0,w1,w2;	% lines will be thinner in fudged styles
	w0=round(fudge.pixels.pw+blacker);
	w1=round(fudge.pixels.pwi+blacker);
	w2=round(fudge.pixels.pwii+blacker);
	vpenwd w0;
fi;
new w98,w99; w99=round .25[w0,w1]; w98=w1;
vpen; top99y2=m+oo; bot99y1=-oo; y2=y4; y1=y3;
x1=lft2x2; rt2x3=x4; y5=y6=y7=.5[y1,y2];
lft0x7=round u; rt0x5=round(r-u); x6=.5[x7,x5];
new ss,mss;		% reciprocal slope at center
if w0=w98: mss=ss; ss=-u/m;
else:	if fixwidth≠0: mss=.75ss; ss=-1.5u/m;
	else: mss=.75ss; ss=-5u/m;
	fi;
fi;
call `a zdraw(7,4,6,1,5,w99,w98,ss);	% lower right and upper left strokes
w99 draw 5{0,1}..2{-1,0}..6{mss,-1}..3{-1,0}..
	7{0,1};	% upper right and lower left strokes
cpen#; lft10x100=r-3.5u; x101=x100; x102=x103=r-u; y101=y102=h; y100=y103=-d;
w10 ddraw 100..101, 103..102;	% erase excess (we drew an infinity)
if fudge≠1: new w0,w1,w2;	% restore normal sizes in fudged styles
	w0=round(pixels.pw+blacker); w1=round(pixels.pwi+blacker);
	w2=round(pixels.pwii+blacker); vpenwd w0;
fi.
"Prime symbol (intended as superscript only)";
call charbegin('060,4.75,0,0,.8ph,0,0);
new w98,w99; w98=round .5[w0,w1]; w99=round(bold+2deltaw);
cpen; top99y1=round .8h; rt99x1=round(r-.25u);
bot98y2=round .05h; lft98x2=round .5u;
call cdraw(1,2,99,98).	% diagonal
"Ownership sign";
call charbegin('063,12,0,0,irrefht+pa,irrefht-pa,0);
cpen; lft10x1=round u; rt10x3=round(r-u);
x5=x6=x1; x2=x4=.5(r-2u);
y1=y2; y3=y6=a; y4=y5; y1-y3=y3-y5=round(mathspread[5/8m,3/4m]+.5);
w10 draw 1..2{1,0}..3{0,-1}..4{-1,0}..5;	% bowl
draw 3..6.	% bar
"Large triangle";
call charbegin('064,16,0,0,ph,pd,0);
cpen; bot10y1=0; y2=y1; top10y3=h+o;
lft10x1=round(.5r-(sqrt48)u); .5[x1,x2]=x3=good10 .5r;
w10 draw 1..2..2..3..3..1.	% stroke
"Large inverted triangle";
call charbegin('065,16,0,0,ph,pd,0);
cpen; top10y1=h-d; y2=y1; bot10y3=-d-o;
lft10x1=round(.5r-(sqrt48)u); .5[x1,x2]=x3=good10 .5r;
w10 draw 1..2..2..3..3..1.	% stroke
"Zero-width slash to negate a relation";
call charbegin('066,14,0,0,ph,ph-2pa,0);
charwd 0; chardw 0;	% reset the width to zero
cpen; rt10x5=round(r-2.5u); lft10x6=round 2.5u;
top10y5=h+o; .5[y5,y6]=a;
w10 draw 5..6.	% diagonal
"Maps-to relation";
call charbegin('067,18,0,0,eqht+pa,eqht-pa,0);
% actually this character should be followed immediately by minus or rtarrow
charwd 0; chardw 0;	% reset the width to zero
cpen; lft10x1=round u; y1=y2=good10 a; y1-y3=y4-y1=.24h+eps;
x9=x10=x1; y9=y4; y10=y3; x2=x1+.5u;
w10 draw 9..10;	% stem
draw 1..2. % bar (this gets over to where the minus sign starts)
"Empty set symbol";
call charbegin('073,9,0,0,ph+pb,pb,0);
if fixwidth=0: new save; save=sqrttwo; new sqrttwo;
	sqrttwo=sqrt(1.23114413save);	% the constant is $2↑{3/10}$
fi;
cpen;
if w1>1.5u: lft1x2=round .75u;
else: x2=good1 1.5u;
fi;
x1=r-x1;	% axis of left-right symmetry
x3=r-x2; top6y1=h+oo; bot22y4=-oo; y3=y2=.5h-hcorr; x4=x1;
call `a arc(theta,1,6,0,2,1);
call `b arc(theta,4,22,0,2,1);	% left part of bowl
call `c arc(theta,1,6,0,3,1);
call `d arc(theta,4,22,0,3,1);	% right part of bowl
if fixwidth=0: new sqrttwo; sqrttwo=save;
fi;
cpen; rt10x7=round(r-2u); lft10x8=round 2u; top10y7=h+b; bot10y8=-b;
w10 draw 7..8.	% diagonal
"Upper case Fraktur R";
call charbegin('074,13,0,0,ph,0,0);
new w99; w99=round .25[w0,w1];
hpen; lft0x1=round u; y1=1/3[e,m]; x2=2u; y2=e;
w0 draw 1{0,-1}..2{1,0};	% point of upper left flourish
x3=3u; top0y3=h+oo; lft99x4=round u;
x5=2u; y5=1/3[m,h]; rt99x6=round 3.5u;
call `a sdraw(3,4,5,6,2,w99,w99,w1,w6,w6,-(h-e)/(8u));	% flourish
x7=x8=good4 6u; y7=m; y8=e;
call `b arc(theta,3,6,0,7,4);	% upper link
w4 draw 7..8;	% stem
x9=3.5u; bot0y9=-o; call `c arc(theta,9,6,0,8,4);	% lower link
x10=5/3u; y10=.3e; x11=4/3u;
x12=u; y12=.35e; x13=2u; y13=.45e;
new aa; x11=x10+aa(y12-y13);
y11=y10+aa(x13-x12);	% perpendicular to $12\to13$
w0 draw 9{-1,0}..10{x11-x10,y11-y10}..11;	% tail
draw 12..13;	% cross
x14=x7; y14=.75h; x15=9.5u; top99y15=h+o;
draw 14{0,1}..15{1,0};	% top of bowl
lft4x16=11.5u; y16=.6h;
w4 draw 15..16;	% diagonal of bowl
lft99x17=lft4x16; y17=y16;
rt99x26=rt4x15; y26=y15;
new aa,bb; rt99x18=aa[rt4x15,rt4x16]; y18=aa[y15,y16];
x18=x17+bb(y15-y16); y18=y17+bb(x16-x15);	% perpendicular to $15\to16$
rpen#; w4 draw 17..18;	% erase excess
hpen; w99 draw 15..26..26..18;	% reinforcements
x20=x7; y20=y21=.52h; x21=9u;
w99 draw 20..21{1,0}..17{x18-x17,y18-y17}..18;	% bottom of bowl
x22=9.25u; y22=.5e; lft99x24=lft4x23; bot4y23=-o;
x24=10.5u; y24=y23; rt99x25=12.5u; y25=e/4;
w4 draw 21..22{x22-x21,y22-y21}..23{1,0};	% lower diagonal
rpen#; w4 draw 24..25;	% erase excess at lower right
hpen; w99 draw 24..25.	% point of lower right diagonal
"Upper case Fraktur I";
call charbegin('075,13,0,0,ph,0,0);
% (this letter extended to be same width as the R)
new w99; w99=round .25[w0,w1];
hpen; x1=5u; y1=good6 .5h; lft99x2=round u; y2=.75h;
x3=x1; top99y3=h+oo;
w99 draw 1{-1,0}..2{0,1}..3{1,0};	% shoulder
x4=9u; y4=.75h; x5=10.5u; bot99y5=2/3h+1;
rt99x6=12.5u; bot99y6=.75h+1;
draw |w99#|3{1,0}..|w4#|4{6u,-h}..|w99#|5{1,0}..6{0,1};	% upper stroke
lft4x7=round u; y7=good6 .25h;
x8=7u; bot4y8=-oo;
x9=good4 10.5u; y9=h/6;
x10=good4 8.5u; y10=.45h;
x11=1/sqrttwo[x12,x10]; y11=1/sqrttwo[y10,y12];
x12=x9; top99y12=.625h;
rt99x13=round 12.5u; y13=.5h;
draw |w4|7{1,0}..8{1,0}..9{0,1}..|w4#|10{0,1}..
	|2/3[w99,w4]|11{x12-x10,y12-y10}..|w99#|12..13{0,-1}.	% lower stroke
"Lattice top";
call charbegin('076,14,0,0,ph,0,0);
cpen; x1=x2=.5r;
lft10x3=round u; x4=r-x3;
bot10y1=0; y2-y1=x4-x3;
if top10y2>h: new y2; top10y2=h;
fi;
y3=y4=y2;
w10 draw 1..2;	% stem
draw 3..4.	% bar
"Perpendicular sign or lattice bottom";
call charbegin('077,14,0,0,ph,0,0);
cpen; x1=x2=.5r;
lft10x3=round u; x4=r-x3; y3=y4=y2;
bot10y2=0; y1-y2=x4-x3;
if top10y1>h: new y1; top10y1=h;
fi;
w10 draw 1..2;	% stem
draw 3..4.	% bar
"Hebrew letter aleph";
call charbegin('100,11,0,0,ph,0,0);
vpen; lft6x1=round u; y1=2/3[m,h];
x4+x5=x3+x6=x2+x7=x0+x9=x1+x8=r; x2=x3=2.5u;
new aa; x2=aa[x1,x8]; y50=aa[y1,y8];
top5y50=top6y2; bot5y50=bot6y3;
x0=1.5u; top6y0=h; y4=y0; x4=5u;
y4+y5=y3+y6=y2+y7=y1+y8=y0+y9=h;
w6 ddraw 0..0{0,-1}..2{x8-x1,y8-y1}..6{x8-x1,y8-y1}..8{0,-1}..9(..5),
	(4..)0..1{0,-1}..3{x8-x1,y8-y1}..7{x8-x1,y8-y1}..
		9{0,-1}..9;	% long diagonal
hpen; x10=3.5u; new aa; x10=aa[x1,x8]; y10=aa[y1,y8];
x11=good1 2u; y11=e;
x12=.5[x11,x13]; y12=.5[y11,y13];
x13=good5 3.5u; y13=.2e;
x14=good5 2u; bot5y14=0;
draw |w0#|10{y8-y1,x1-x8}..|w1|11{0,-1}..
	|.5[w1,w5]|12{1.5(x13-x11),y13-y11}..
	|w5#|13{0,-1}..14{-1,0};	% lower left stroke
x15=7.75u; new aa; x15=aa[x1,x8]; y15=aa[y1,y8];
x16=.5[x21,x28]; y16=.5[y21,y28];
vpen; lft6x21=round 7u; y21=y1;
x20+x29=x21+x28=x22+x27=x24+x25; x28=x8;
y20+y29=y21+y28=y22+y27=y24+y25; y28=.25[m,h];
top5y16=top6y22; x22=x27;
x20=7.5u; x24=9.5u; y20=y24=y0;
w6 ddraw 20..20{0,-1}..22{x28-x21,y28-y21}..28{0,-1}..29(..25),
	(24..)20..21{0,-1}..27{x28-x21,y28-y21}..
		29{0,-1}..29;	% short diagonal
draw 15{0,1}..16{0,1}.	% link
"Multiset union sign";
call charbegin('135,12,0,0,ph,ph-2pa,0);
cpen; lft10x1=round u; x2=x1; x3=r-x3; x4=x5=r-x1;
y1=good10 .8h+o; bot6y3=-o; y2=y4=2/3[y1,y3]; y5=y1;
call qcirc(3,6,2,w10); call qcirc(3,7,4,w10);	% cup
w10 draw 1..2; draw 4..5;	% stems
y8=y9=.47[y1,y3]; x8=r-x9=x1+2w10+eps;
x10=x11=x3; .5[y10,y11]=y8; y11-y10=x9-x8;
draw 8..9; draw 10..11.	% enclosed plus sign
"Left turnstile";
call charbegin('140,11,0,0,ph,0,0);
cpen; .5[y1,y2]=y3=y4; x1=x2=x3;
lft10x3=round u; x4=r-x3; top10y1=h; bot10y2=0;
w10 draw 1..2;	% stem
draw 3..4.	% bar
"Right turnstile";
call charbegin('141,11,0,0,ph,0,0);
cpen; .5[y1,y2]=y3=y4; x1=x2=x4;
lft10x3=round u; x4=r-x3; top10y1=h; bot10y2=0;
w10 draw 1..2;	% stem
draw 3..4.	% bar
"Left floor bracket";
call charbegin('142,8,0,0,ph+pb,ph+pb-2pa,0);
cpen; x1=x2=good10 3.5u; x3=x1+3.75u+eps;
top10y1=h+b; .5[y1,y2]=a; y3=y2;
w10 draw 1..2..2..3.	% stem and bar
"Right floor bracket";
call charbegin('143,8,0,0,ph+pb,ph+pb-2pa,0);
cpen; x1=x2=good10(r-3.5u); x3=x1-3.75u-eps;
top10y1=h+b; .5[y1,y2]=a; y3=y2;
w10 draw 1..2..2..3.	% stem and bar
"Left ceiling bracket";
call charbegin('144,8,0,0,ph+pb,ph+pb-2pa,0);
cpen; x1=x2=good10 3.5u; x3=x1+3.75u+eps;
top10y1=h+b; .5[y1,y2]=a; y3=y1;
w10 draw 3..1..1..2.	% bar and stem
"Right ceiling bracket";
call charbegin('145,8,0,0,ph+pb,ph+pb-2pa,0);
cpen; x1=x2=good10(r-3.5u); x3=x1-3.75u-eps;
top10y1=h+b; .5[y1,y2]=a; y3=y1;
w10 draw 3..1..1..2.	% bar and stem
"Left angle bracket";
call charbegin('150,7,0,0,ph+pb,ph+pb-2pa,0);
cpen; rt10x1=round(r-u); x1=x3; lft10x2=round 2u;
top10y1=h+b; .5[y1,y3]=y2=good10a;
w10 draw 1..2..2..3.	% diagonals
"Right angle bracket";
call charbegin('151,7,0,0,ph+pb,ph+pb-2pa,0);
cpen; rt10(r-x1)=round(r-u); x1=x3; lft10(r-x2)=round 2u;
top10y1=h+b; .5[y1,y3]=y2=good10a;
w10 draw 1..2..2..3.	% diagonals
"Double vertical line (norm or cardinality)";
call charbegin('153,9,0,0,ph+pb,ph+pb-2pa,0);
cpen; x1=x2; top10y1=h+b; .5[y1,y2]=a;
x3=x4=r-x1; y3=y1; y4=y2;
x3-x1=round(mathspread[.45m,.55m]+.5);
w10 draw 1..2; draw 3..4.	% stems
"Up and down arrow";
call charbegin('154,9,0,0,ph+pb,ph+pb-2pa,.75ph.slant+.5pw-pu);
cpen; top10y1=y0=h+b; .5[y1,y11]=a; y10=bot10y11;
x0=x1=x11=x5=x8=x10=x15=x18=good10 .5r;
w10 draw 1..11;	% stem
vpen; top6y8=y0; bot6y18=y10;
lpen#; w10 draw 0..8; rpen#; w10 draw 0..8;	% clean the top
lpen#; w10 draw 10..18; rpen#; w10 draw 10..18;	% clean the bottom
y5-y8=y8-y3=.24h+eps; y3=y4=y6=y7;
y15-y18=y18-y13=-.24h-eps; y13=y14=y16=y17;
x3-x6=x1-x3=x4-x1=x7-x4=3u+eps;
x13-x16=x11-x13=x14-x11=x17-x14=3u+eps;
lpen#; w10 draw (5..)8..3(..6);	% erase excess at left
lpen#; w10 draw (15..)18..13(..16);	% erase excess at left
vpen; w6 draw (5..)8..3(..6);	% left point
vpen; w6 draw (15..)18..13(..16);	% left point
rpen#; w10 draw (5..)8..4(..7);	% erase excess at right
rpen#; w10 draw (15..)18..14(..17);	% erase excess at right
vpen; w6 draw (5..)8..4(..7);	% right point
vpen; w6 draw (15..)18..14(..17).	% right point
"Double up-and-down arrow";
call charbegin('155,9,-1,-1,ph+pb,ph+pb-2pa,0);
cpen; top10y1=y0=h+b; .5[y1,y101]=a; y11=y1; y111=y101; bot10y101=y100;
x0=x5=x8=x100=x105=x108=good10 .5r; x1=x101; x11=x111;
.5[x1,x11]=x5; x1-x11=round(mathspread[.45m,.55m]+.5);
w10 draw 1..101; draw 11..111;	% stems
vpen; top1y8=y0; bot1y108=y100;
lpen#; 2u+w10 draw 0..8; rpen#; 2u+w10 draw 0..8;	% clean the top
lpen#; 2u+w10 draw 100..108; rpen#; 2u+w10 draw 100..108;	% clean the bottom
y5-y8=y8-y3=fixwidth[6u,3u]; y3=y4=y6=y7;
y105-y108=y108-y103=fixwidth[-6u,-3u]; y103=y104=y106=y107;
x3-x6=x11-x3=x4-x1=x7-x4=3u+eps;
x103-x106=x111-x103=x104-x101=x107-x104=3u+eps;
lpen#; 2u+w10 draw (5..)8..3(..6);	% erase excess at left
lpen#; 2u+w10 draw (105..)108..103(..106);	% erase excess at left
vpen; draw (|w1|5..)8..|w6|3(..6);	% left point
vpen; draw (|w1|105..)108..|w6|103(..106);	% left point
rpen#; 2u+w10 draw (5..)8..4(..7);	% erase excess at right
rpen#; 2u+w10 draw (105..)108..104(..107);	% erase excess at right
vpen; draw (|w1|5..)8..|w6|4(..7);	% right point
vpen; draw (|w1|105..)108..|w6|104(..107).	% right point
"Wreath product";
call charbegin('157,5,0,0,ph,ph-2pa,0);
hpen; rt10x1=rt20x4=round(r-u);
lft10x2=lft20x3=round u;
top10y3=round .75[a,h]; x5=.5[x1,x2]; a=.5[y3,y4]=y5;
call `a sdraw(3,1,5,2,4,w10,w10,w10+2deltaw,w6,w6,m/(5u)).	% stroke
"Radical sign";
call charbegin('160,15,0,ls,prt,2(ph+pb-pa)-prt,0);
hpen; x1=good10(20/3u); x2=r+1; top10y0=h+b; bot10y2=0; .5[y1,y2]=a+y2-y0;
y3=y5=y7=good6(a+y2-y0); y4=y6=y1;
x7=1.5[x2,x1]; lft10x7=lft2x3; rt2x3=rt0x5;
lft10x1=lft2x4; rt2x4=rt0x6;
x8=x7-u; new aa; x8=aa[x5,x2]; y8=aa[y5,y2];
hpen; w2 draw 3..4;	% left diagonal
w10 draw 7..4; w0 draw 5..6;	% sharpen the corners
lpen#; w2 draw 8..5;	% erase excess at upper left
hpen; w0 draw 8..5;	% serif
rpen#; w2 draw 1..2;	% erase excess at lower right
hpen; w10 draw 1..2.	% right diagonal
"Amalgamation symbol or coproduct symbol";
% I took the program for H and made obvious changes
% Reference for the name `amalgamation' is book by Grothendieck and Dieudonne
call charbegin('161,13+uc,usc,usc,phh,0,0);
hpen; 
if w4>2u: lft4x1=round 2u; rt4x3=round(r-2u);
else: x1=good4 3u; x3=good4(r-3u);
fi;
x2=x1; x4=x3;
top4y1=hh; y1=y3;
bot4y2=0; y2=y4;
w4 draw 1..2;	% left stem
w4 draw 3..4;	% right stem
cpen; x5=x1; x6=x3; y5=y6; bot18y5=0;
w18 draw 5..6;	% bar
if ucs≠0: new aa;
	if rt4x1+ucs.u+2u>lft4x3-ucs.u-2: rt4x1+aa.u+2u=lft4x3-aa.u-2;
	else: aa=ucs;
	fi;
	call `a serif(1,4,2,1/3,-ucs);
		call `b serif(1,4,2,1/3,aa);
		call `c ubserif(1,4,-ucs,aa);	% upper left serif
	call `d serif(2,4,1,1/3,-ucs);
		call `f bserif(2,4,-ucs,0);	% lower left serif
	call `g serif(3,4,4,1/3,-aa);
		call `h serif(3,4,4,1/3,ucs);
		call `i ubserif(3,4,-aa,ucs);	% upper right serif
	call `k serif(4,4,3,1/3,ucs);
		call `l bserif(4,4,0,ucs);	% lower right serif
fi.
"Nabla or backwards-difference operator";
call charbegin('162,15,0,0,ph,0,0);
hpen; rt0x2=round(r-u); lft4x4=round u; top0y2=h; top4y4=h;
bot4y5=-o; y6=y5;
x6-x2=x4-x5; lft4x5=lft0x6; x1=x2; x3=x4;
vpen; top2y1=h; y3=y1;
w2 draw 1..3;	% bar line
lpen#; w2 draw 5..4;	% erase excess at upper left
hpen; w4 draw 5..4;	% left diagonal
rpen#; w4 draw 6..2; w2 draw 6..2;	% erase excess at right
hpen; w0 draw 6..2;	% right diagonal
y7=y4; lft0x7=lft4x4;
w0 draw 2..7..7..6.	% sharpen upper left corner
"Square set union sign (Scott lub)";
call charbegin('164,12,0,0,.8ph,0,0);
cpen; lft10x1=round 1.05u; x2=x1; x4=x5=r-x1;
y1=good10 .8h; bot10y2=0; y2=y4; y5=y1;
w10 draw 1..2..2..4..4..5.	% stroke
"Square set intersection sign (Scott glb)";
call charbegin('165,12,0,0,.8ph,0,0);
cpen; lft10x1=round 1.05u; x2=x1; x4=x5=r-x1;
y2=good10 .8h; bot10y1=0; y2=y4; y5=y1;
w10 draw 1..2..2..4..4..5.	% stroke
"Square reflexive subset sign";
call charbegin('166,14,0,0,refht+pa,refht-pa,0);
cpen; lft10x6=round 1.5u; x2=x3=x7=r-x6; x4=x6+oo;
% once I had lft10x4=round x6; a long straight line tends to appear moved
y2-y3=round(mathspread[5/4m,3/2m]+.5); y3-y7=round(mathspread[.45m,.55m]+.5);
y2=good10(a+.5(y2-y7));
.5[y2,y3]=y1; x4=x5; y4=y2; y5=y3;
w10 draw 2..4..4..5..5..3;	% stroke
y6=y7;
draw 6..7.	% bar
"Square reflexive superset sign";
call charbegin('167,14,0,0,refht+pa,refht-pa,0);
cpen; rt10x6=round(r-1.5u); x2=x3=x7=r-x6; x4=x6-oo;
% once I had lft10x4=round x6; a long straight line tends to appear moved
y2-y3=round(mathspread[5/4m,3/2m]+.5); y3-y7=round(mathspread[.45m,.55m]+.5);
y2=good10(a+.5(y2-y7));
.5[y2,y3]=y1; x4=x5; y4=y2; y5=y3;
w10 draw 2..4..4..5..5..3;	% stroke
y6=y7;
draw 6..7.	% bar
"Section sign";
call charbegin('170,8,0,0,ph,pd,0);
hpen; x1=x4=.5r; rt0x2=rt1x3=round(r-1.5u); lft0x5=lft1x6=round 1.5u;
top0y1=h+oo; bot0y4=-d-oo;
y2=y3=.125[y1,y4]; y5=y6=.125[y4,y1];
w0 draw 1{1,0}..2{0,-1};	% upper link
draw 4{-1,0}..5{0,1};	% lower link
cpen; w1 draw 3; draw 6;	% bulbs
x7=x11=x5; x9=x12=x2; x8=x10=x1;
y8=1/3[y1,y4]; y10=1/3[y4,y1];
call `a sdraw(1,7,8,9,10,
	w1-deltaw,w1-deltaw,w0,w6,w6,-(h+d)/(36u));	% upper stroke
call `b sdraw(8,11,10,12,4,
	w1-deltaw,w1-deltaw,w0,w6,w6,-(h+d)/(36u)).	% lower stroke
"Dagger mark";
call charbegin('171,8,0,0,ph,pd,0);
cpen; x1=x2=x3=x4=good1(.5r); lft1x5=round u; x6-x2=x2-x5;
top1y1=h; bot6y4=-d; y2=y5=y6=good1m; y3=e;
w1 draw 1; draw 5; draw 6;	% bulbs
hpen; draw |w1|1..|w0|2;	% top stem
draw |w0|2..|(round .5[w0,w1])-eps #|3..|w0|4;	% bottom stem
vpen; draw |w1|5..|w0|2; draw |w1|6..|w0|2.	% bars
"Double dagger mark";
call charbegin('172,8,0,0,ph,pd,0);
cpen; x1=x2=x3=x6=x7=x8=good1(.5r); lft1x4=round u; x5-x2=x2-x4;
x9=x4; x10=x5;
top1y1=h; bot1y3=.5[y1,y8]=top1y6; bot1y8=-d;
y2=y4=y5=good1 .5[y1,y3]; y7=y9=y10=good1 .5[y6,y8];
w1 draw 1; draw 3; draw 4; draw 5; draw 6; draw 8; draw 9; draw 10;	% bulbs
hpen; draw |w1|1..|w0|2; draw |w1|3..|w0|2;
	draw |w1|6..|w0|7; draw |w1|8..|w0|7;	% stems
vpen; draw |w1|4..|w0|2; draw |w1|5..|w0|2;
	draw |w1|9..|w0|7; draw |w1|10..|w0|7.	% bars
"Paragraph mark";
call charbegin('173,11,0,0,ph,pd,0);
cpen; top10y1=h; bot10y6=-d; y4=y7=y9=y1;
y8=y6; y3=y5=good10 .5[y1,y6];
lft10x2=round u; y2=.5[y1,y3]; x1=x3=.5r; x4=x5=x6=good10 .5(r+2u);
x7=x8=x6+2u; x9=r-u;
w10 ddraw 4..1{-1,0}..2{0,-1}..3{1,0}..5, 4..4..4..5..5;	% filled bowl
draw 6..4..4..9;	% left stem and upper serif
draw 7..8.	% right stem
"Club suit";
call charbegin('174,14,0,0,ph,.5pd,0);
cpen; x1=x8=x0=x20=good10(.5r); x2=.5[x4,x1]; x22=x12=.5[x4,x10];
lft10x4=round u;
rt10x10+2=lft10x1; x16=good10(x1-.5u);
x7-x6=x1-x4;
x2+x3=x4+x5=x6+x7=x10+x11=x12+x13=x16+x17=x22+x23=x1+x1;
y6=y7=.5[y8,y0]; y8-y0=y22-y2; y22=y23; y20=.5[y0,y8];
y4=y5=.5[y22,y2]; y12=y13; y16=y17;
bot10y16=-.5d; bot10y12=y1+1; top10y22=round .55h;
%y10=y11=y1=good10 .23h; bot10y2=-o; y3=y2;
y10=y11=y1=good10 .1h; bot10y2=-o; y3=y2;
top10y8=h+o+oo;
w10 ddraw 6{0,1}..8{1,0}..7{0,-1}, 6{0,-1}..0{1,0}..7{0,1};	% top bowl
ddraw 4{0,1}..22{1,0}..10{0,-1}, 4{0,-1}..2{1,0}..10{0,1};	% left bowl
ddraw 5{0,1}..23{-1,0}..11{0,-1}, 5{0,-1}..3{-1,0}..11{0,1};	% right bowl
ddraw 1{0,-1}..16{x16-x1,.5(y16-y1)},1{0,-1}..17{x17-x1,.5(y17-y1)};	% stem
ddraw 12..13, 20..20.	% filling
"Diamond suit";
call charbegin('175,14,0,0,ph,.5pd,0);
cpen; x1=good10(.5r); lft10x2=round u; x2+x3=x1+x1; x4=x1;
top10y1=h+o+oo; bot10y4=round(-.5d-o-oo); y2=y3=.5[y1,y4];
w10 draw 1{x3-x1,1.5(y3-y1)}..3{1.5(x3-x1),y3-y1};	% upper right diagonal
draw 1{x2-x1,1.5(y2-y1)}..2{1.5(x2-x1),y2-y1};	% upper left diagonal
draw 4{x2-x4,1.5(y2-y4)}..2{1.5(x2-x4),y2-y4};	% lower left diagonal
draw 4{x3-x4,1.5(y3-y4)}..3{1.5(x3-x4),y3-y4}.	% lower right diagonal
"Heart suit";
call charbegin('176,14,0,0,ph,.5pd,0);
cpen; x1=good10(.5r); x2=4u;
lft10x4=round u; x8=x1;
x2+x3=x4+x5=x6+x7=x1+x1;
y1=good10 .77h; top10y2=h+o; y3=y2; y4=y5=.7h;
bot10y8=-o-oo;
x9=x10=r; y9=.6h; y10=1.5h;
y6=y7=.2h;
new aa; y7=aa[y8,y5]; x7=aa[x8,x5];
w10 draw 8{x10-x8,y10-y8}..7{x9-x8,y9-y8}..5{0,1}..
	3{-1,0}..1{x1-x3,8(y1-y3)};	% right bowl
draw 8{x8-x10,y10-y8}..6{x8-x9,y9-y8}..4{0,1}..
	2{1,0}..1{x1-x2,8(y1-y2)}.	% left bowl
"Spade suit";
call charbegin('177,14,0,0,ph,.5pd,0);
cpen; x1=good10(.5r); x2=.5[x4,x10];
lft10x4=round u; x8=x1;
rt10x10+2=lft10x1; x12=.5[x10,x1]; x14=.5[x4,x10]; x16=good10(x1-.5u);
x2+x3=x4+x5=x6+x7=x10+x11=x12+x13=x14+x15=x16+x17=x1+x1; x0=x1; y0=.5h;
y10=y11=y1=y14=y15;y12=y13;y16=y17;
bot10y16=-.5d; bot10y12=y1+1;
%y1=good10 .23h; bot10y2=-o; y3=y2; y4=y5=.3h;
y1=good10 .1h; bot10y2=-o; y3=y2; y4=y5=.3h;
top10y8=h+o+oo;
x99=x100=r; y99=.5h; y100=-.5h;
y6=y7=.7h;
new aa; y7=aa[y8,y5]; x7=aa[x8,x5];
w10 ddraw 8{x100-x8,y100-y8}..7{x99-x8,y99-y8}..5{0,-1}..3{-1,0}..11{0,1},
	0..0..15..15..15;	% right bowl and interior
ddraw 8{x8-x100,y100-y8}..6{x8-x99,y99-y8}..4{0,-1}..2{1,0}..10{0,1},
	0..0..14..14..14;	% left bowl and interior
ddraw 1{0,-1}..16{x16-x1,.5(y16-y1)},1{0,-1}..17{x17-x1,.5(y17-y1)};	% stem
ddraw 14..12..12..13..13..15, 0..0..0..0..0..0.	% rest of the interior